﻿using System;
using System.Collections.Generic;
using System.Linq;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Modelo.Objetos;
using Onshi.POS.Repositorios;
using Onshi.POS.Vendedores.Vistas;

namespace Onshi.POS.Vendedores
{
    public class VendedoresBajaHabilitacionPresentador
    {
        #region Constructores

        public VendedoresBajaHabilitacionPresentador(IVendedoresBajaHabilitacion vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IVendedoresBajaHabilitacion vista;
        private List<Vendedor> lista;

        #endregion

        #region Propiedades

        private RepositorioVendedor RepositorioVendedor
        {
            get { return new RepositorioVendedor(); }
        }

        private RepositorioTipoRegistro RepositorioTipoRegistro
        {
            get { return new RepositorioTipoRegistro(); }
        }

        private RepositorioRegistro RepositorioRegistro
        {
            get { return new RepositorioRegistro(); }
        }

        #endregion

        #region Metodos

        private void ActualizarLista()
        {
            lista = RepositorioVendedor.DevolverTodos();
        }

        private List<Vendedor> FiltrarLista()
        {
            if (lista != null)
            {
                var consulta = (from item in lista
                                where item.Rubro.Id == (vista.IdRubroVendedorFiltro == (Int32)EnumRubroVendedor.TODOS ? item.Rubro.Id : vista.IdRubroVendedorFiltro)
                                & item.TipoComision.Id == (vista.IdTipoComosionVendedorFiltro == (Byte)EnumTipoComisionVendedor.TODOS ? item.TipoComision.Id : vista.IdTipoComosionVendedorFiltro)
                                & item.Codigo.Trim().ToLower().Contains(vista.CodigoFiltro.Trim().ToLower())
                                & item.Nombre.Trim().ToLower().Contains(vista.NombreFiltro.Trim().ToLower())
                                & item.Cuit.Trim().ToLower().Contains(vista.CuitFiltro.Trim().ToLower())
                                & (item.Comision >= vista.ComisionDesdeFiltro & item.Comision <= vista.ComisionHastaFiltro)
                                & (item.ComisionMaxima >= vista.ComisionMaximaDesdeFiltro & item.ComisionMaxima <= vista.ComisionMaximaHastaFiltro)
                                & (item.EstaEliminado == (vista.EstaEliminadoFiltro == EnumEstadoCheck.TODOS ? item.EstaEliminado : (vista.EstaEliminadoFiltro == EnumEstadoCheck.SI ? true : false)))
                                & (item.TieneDomicilios == (vista.TieneDomiciliosFiltro == EnumEstadoCheck.TODOS ? item.TieneDomicilios : (vista.TieneDomiciliosFiltro == EnumEstadoCheck.SI ? true : false)))
                                & (item.TieneTelefonos == (vista.TieneTelefonosFiltro == EnumEstadoCheck.TODOS ? item.TieneTelefonos : (vista.TieneTelefonosFiltro == EnumEstadoCheck.SI ? true : false)))
                                & (item.TieneObservacion == (vista.TieneObservacionFiltro == EnumEstadoCheck.TODOS ? item.TieneObservacion : (vista.TieneObservacionFiltro == EnumEstadoCheck.SI ? true : false)))
                                & (item.TieneImagen == (vista.TieneImagenFiltro == EnumEstadoCheck.TODOS ? item.TieneImagen : (vista.TieneImagenFiltro == EnumEstadoCheck.SI ? true : false)))
                                & (item.TieneInternet == (vista.TieneInternetFiltro == EnumEstadoCheck.TODOS ? item.TieneInternet : (vista.TieneInternetFiltro == EnumEstadoCheck.SI ? true : false)))
                                select item).ToList();
                return consulta;
            }
            else
                return lista;
        }

        public void Inicializar()
        {
            ActualizarLista();
            vista.Lista = lista;
        }

        public void Nuevo()
        {
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Modificar()
        {
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Eliminar()
        {
            if (!DatosComunes.TienePermiso(EnumPermiso.VENDEDOR_BAJA))
                throw new Exception(DatosComunes.SinPermiso);
            if (vista.IdVendedor == (Int32)EnumVendedor.TITULAR_DEL_COMERCIO)
                throw new Exception("El vendedor no se puede eliminar");
            var vendedor = RepositorioVendedor.DevolverPorId(vista.IdVendedor);
            if (vendedor == null)
                throw new Exception("El vendedor no existe");
            if (vendedor.EstaEliminado)
                throw new Exception("El vendedor no se encuentra habilitado");
            var registro = new Registro();
            registro.Usuario = DatosComunes.Usuario;
            registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.VENDEDOR_BAJA);
            if (registro.Tipo == null)
                throw new Exception("El tipo de registro no existe");
            RepositorioVendedor.Eliminar(vendedor);
            RepositorioRegistro.Insertar(registro, vendedor);
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Habilitar()
        {
            //TODO: falta despues cuando se implemente el cliente setear a todos los clientes el vendedor por defecto
            if (!DatosComunes.TienePermiso(EnumPermiso.VENDEDOR_HABILITACION))
                throw new Exception(DatosComunes.SinPermiso);
            if (vista.IdVendedor == (Int32)EnumVendedor.TITULAR_DEL_COMERCIO)
                throw new Exception("El vendedor no se puede habilitar");
            var vendedor = RepositorioVendedor.DevolverPorId(vista.IdVendedor);
            if (vendedor == null)
                throw new Exception("El vendedor no existe");
            if (!vendedor.EstaEliminado)
                throw new Exception("El vendedor no se encuentra eliminado");
            var registro = new Registro();
            registro.Usuario = DatosComunes.Usuario;
            registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.VENDEDOR_HABILITACION);
            if (registro.Tipo == null)
                throw new Exception("El tipo de registro no existe");
            RepositorioVendedor.Habilitar(vendedor);
            RepositorioRegistro.Insertar(registro, vendedor);
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Actualizar()
        {
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Filtrar()
        {
            vista.Lista = FiltrarLista();
        }

        public void VerObservacion()
        {
            var vendedor = RepositorioVendedor.DevolverPorIdConDetalleDomiciliosTelefonos(vista.IdVendedor);
            vista.Detalle = vendedor.Detalle;
        }

        #endregion
    }
}
